package asem.ast.sentencias;

import genc.GenC;

import java.util.LinkedList;

import alex.Token;
import asem.TablaSimbolos;
import asem.ast.MetodosComunes;
import asem.excepciones.ExcepcionEntidadNoDeclarada;
import asem.tablaSimbolos.VariableLocal;
import asem.tablaSimbolos.tipo.Tipo;
import asem.tablaSimbolos.tipo.TipoClase;

public class NodoDeclaracion extends NodoSentencia {
	protected Tipo tipo;
	protected LinkedList<Token> conjuntoVars;

	public NodoDeclaracion(Tipo t, LinkedList<Token> lista) {
		tipo = t;
		conjuntoVars = lista;
	}

	public boolean chequeoSentencias(NodoBloque contenedor) {
		// Agrego a mi nodoBloque contenedor, las variables locales al bloque,
		// siempre que no exista otra variable accesible con el mismo nombre.

		if (tipo instanceof TipoClase)
			if (TablaSimbolos.tabla.getClase(tipo.toString()) == null)
				throw new ExcepcionEntidadNoDeclarada(conjuntoVars.getFirst(),
						tipo.toString(), "variable");

		for (Token id : conjuntoVars) {
			MetodosComunes.esValidoInsertar(id, contenedor);
			contenedor.addVarLocal(id.getLexema(), new VariableLocal(id, tipo,
					TablaSimbolos.tabla.metodoActual().getNombre()));
		}

		int cantVars = conjuntoVars.size();
		GenC.gen.reservaMem(Integer.toString(cantVars),
				"Se reserva memoria para " + cantVars + " vars locales");

		return false;
	}
}